package com.example.common.mvi

import com.google.gson.Gson
import com.google.gson.GsonBuilder
import okhttp3.OkHttpClient
import okhttp3.logging.HttpLoggingInterceptor
import retrofit2.Retrofit
import retrofit2.converter.gson.GsonConverterFactory
import java.util.concurrent.TimeUnit

/**
 * 网络配置类
 * 提供Retrofit和OkHttp的统一配置
 */
object NetworkConfig {

    private const val CONNECT_TIMEOUT = 30L // 连接超时时间（秒）
    private const val READ_TIMEOUT = 30L // 读取超时时间（秒）
    private const val WRITE_TIMEOUT = 30L // 写入超时时间（秒）

    /**
     * 创建Gson实例
     * 配置JSON解析器
     */
    fun createGson(): Gson {
        return GsonBuilder() // 创建Gson构建器
            .setLenient() // 设置宽松模式，允许格式不严格的JSON
            .create() // 创建Gson实例
    }

    /**
     * 创建OkHttpClient
     * 配置HTTP客户端
     * @param isDebug 是否为调试模式
     */
    fun createOkHttpClient(isDebug: Boolean = true): OkHttpClient {
        val builder = OkHttpClient.Builder() // 创建OkHttp构建器
            .connectTimeout(CONNECT_TIMEOUT, TimeUnit.SECONDS) // 设置连接超时
            .readTimeout(READ_TIMEOUT, TimeUnit.SECONDS) // 设置读取超时
            .writeTimeout(WRITE_TIMEOUT, TimeUnit.SECONDS) // 设置写入超时

        // 添加日志拦截器（仅在Debug模式下）
        if (isDebug) {
            val loggingInterceptor = HttpLoggingInterceptor().apply { // 创建日志拦截器
                level = HttpLoggingInterceptor.Level.BODY // 设置日志级别为BODY，记录完整请求和响应
            }
            builder.addInterceptor(loggingInterceptor) // 添加拦截器
        }

        return builder.build() // 构建OkHttpClient
    }

    /**
     * 创建Retrofit实例
     * 配置网络请求框架
     * @param baseUrl 基础URL
     * @param okHttpClient HTTP客户端
     * @param gson JSON解析器
     */
    fun createRetrofit(
        baseUrl: String, // 基础URL
        okHttpClient: OkHttpClient = createOkHttpClient(), // 默认HTTP客户端
        gson: Gson = createGson() // 默认JSON解析器
    ): Retrofit {
        return Retrofit.Builder() // 创建Retrofit构建器
            .baseUrl(baseUrl) // 设置基础URL
            .client(okHttpClient) // 设置HTTP客户端
            .addConverterFactory(GsonConverterFactory.create(gson)) // 添加Gson转换器
            .build() // 构建Retrofit实例
    }

    /**
     * 创建API服务
     * 泛型方法，创建指定类型的API服务接口
     * @param baseUrl 基础URL
     * @param okHttpClient HTTP客户端
     * @param gson JSON解析器
     * @return T 返回指定类型的API服务实例
     */
    inline fun <reified T> createApiService( // reified关键字允许在运行时获取泛型类型
        baseUrl: String, // 基础URL
        okHttpClient: OkHttpClient = createOkHttpClient(), // 默认HTTP客户端
        gson: Gson = createGson() // 默认JSON解析器
    ): T {
        return createRetrofit(baseUrl, okHttpClient, gson).create(T::class.java) // 创建API服务实例
    }
}